
#Область СобытияФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("РежимВыбора") Тогда
		РежимВыбора=Параметры.РежимВыбора;
	КонецЕсли;
	Если Параметры.Свойство("ИмяОбъектаМетаданных") Тогда
		ИмяОбъектаМетаданных=Параметры.ИмяОбъектаМетаданных;
	КонецЕсли;

	ЗаполнитьДеревоМетаданных();
	
	Если ЗначениеЗаполнено(ИмяОбъектаМетаданных) Тогда
		Элементы.ГруппаМетаданные.Видимость=Ложь;
		УстановитьПараметрыДинамическогоСпискаНаСервере(ИдентификаторСтрокиОбъектаМетаданных);
	КонецЕсли;

	ЗакрыватьПриВыборе = РежимВыбора;
	
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры
#КонецОбласти

#Область ОбработчикиСобытийЭлементовФормы

&НаКлиенте
Процедура ДеревоМетаданныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	УстановитьПараметрыДинамическогоСпискаНаСервере(ВыбраннаяСтрока);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ДинамическийСписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если Не РежимВыбора Тогда
		Возврат;
	КонецЕсли;
	СтандартнаяОбработка = Ложь;
	ОповеститьОВыборе(ВыбраннаяСтрока);
КонецПроцедуры

//@skip-check module-unused-method
&НаКлиенте
Процедура Подключаемый_ДинамическийСписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	Если Не РежимВыбора Тогда
		Возврат;
	КонецЕсли;
	СтандартнаяОбработка = Ложь;
	ОповеститьОВыборе(Значение);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьОбъект(Команда)
	Если Элементы.ГруппаСтраницыВыбораДинамическогоСписка.ТекущаяСтраница <> Элементы.ГруппаДинамическийСписок Тогда
		Возврат;
	КонецЕсли;

	ИмяРеквизитаФормы = "ДинамическийСписок";

	ТекСсылка=Элементы[ИмяРеквизитаФормы].ТекущаяСтрока;
	Если ТекСсылка = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(ТекСсылка);
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	ЗаполнитьДеревоМетаданных();
	Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
		УдалитьСтрокиДереваЕслиНетПодчиненныхПриПоиске();	
		Для каждого СтрокаДерева Из ДеревоМетаданных.ПолучитьЭлементы() Цикл 
			Элементы.ДеревоМетаданных.Развернуть(СтрокаДерева.ПолучитьИдентификатор());
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры


#КонецОбласти

#Область ПрочиеФункции

&НаСервере
Процедура УдалитьДинамическийСписок(ИмяРеквизита)
	МассивУдаляемыхРеквизитов = Новый Массив;
	МассивУдаляемыхРеквизитов.Добавить(ИмяРеквизита);

	ТекущиеРеквизитыФормы = ПолучитьРеквизиты();

	ЕстьРеквизит = Ложь;
	Для Каждого рекв Из ТекущиеРеквизитыФормы Цикл
		Если рекв.Имя = ИмяРеквизита Тогда
			ЕстьРеквизит = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если ЕстьРеквизит Тогда
		ИзменитьРеквизиты( , МассивУдаляемыхРеквизитов);
	КонецЕсли;

	ДинамичныйСписок = ЭтаФорма.Элементы.Найти(ИмяРеквизита);
	Если ДинамичныйСписок <> Неопределено Тогда
		Элементы.Удалить(ДинамичныйСписок);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрыДинамическогоСпискаНаСервере(ВыбраннаяСтрока)
	ТекДанные = ДеревоМетаданных.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Заголовок=ТекДанные.Представление;

	ИмяРеквизитаФормы = "ДинамическийСписок";
	УдалитьДинамическийСписок(ИмяРеквизитаФормы);

	Если Не ЗначениеЗаполнено(ТекДанные.ВидОбъекта) Тогда
		Элементы.ГруппаСтраницыВыбораДинамическогоСписка.ТекущаяСтраница = Элементы.ГруппаБезДинамическогоСписка;
		Возврат;
	КонецЕсли;

	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаФормы, Новый ОписаниеТипов("ДинамическийСписок"), ,
		ТекДанные.Представление, Ложь));

	ИзменитьРеквизиты(ДобавляемыеРеквизиты);

	ТекСписок = ЭтотОбъект[ИмяРеквизитаФормы];

	ТекСписок.ОсновнаяТаблица = ТекДанные.ТипОбъектов + "." + ТекДанные.ВидОбъекта;
	ТекСписок.ПроизвольныйЗапрос = Ложь;
	

	//Получаем реквизиты нашего списка
	МассивРеквизитовСписка = Новый Массив;
	РеквизитыСписка = ПолучитьРеквизиты(ИмяРеквизитаФормы);
	Для Каждого ТекРеквизит Из РеквизитыСписка Цикл
		МассивРеквизитовСписка.Добавить(ТекРеквизит.Имя);
	КонецЦикла;

	// Создаём таблицу (элемент формы) для отображения данных
	ЭлементФормы = Элементы.Добавить(ИмяРеквизитаФормы, Тип("ТаблицаФормы"), Элементы.ГруппаДинамическийСписок);
	ЭлементФормы.ПутьКДанным = ИмяРеквизитаФормы;
	ЭлементФормы.Подсказка = ТекДанные.Комментарий;
	ЭлементФормы.Заголовок = ТекДанные.Представление;
	ЭлементФормы.УстановитьДействие("Выбор", "Подключаемый_ДинамическийСписокВыбор");
	ЭлементФормы.УстановитьДействие("ВыборЗначения", "Подключаемый_ДинамическийСписокВыборЗначения");
	ЭлементФормы.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы;
	//	ЭлементФормы.РежимВыделения = ?(РежимПросмотраБД, РежимВыделенияТаблицы.Множественный, РежимВыделенияТаблицы.Одиночный);
	//ЭлементФормы.ТекущийЭлемент.ТекущиеДанные = ВыбСсылка; //Жалко не работает. Хорошо бы устанавливать текущую строку.
	ЕстьОтображаемыеРеквизиты = Ложь;
	// Создаём колонки в отображаемой таблице
	Для Каждого ТекРеквизит Из ТекДанные.Реквизиты Цикл
		Если МассивРеквизитовСписка.Найти(ТекРеквизит.Имя) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Попытка
			Колонка = Элементы.Добавить(ИмяРеквизитаФормы + ТекРеквизит.Имя, Тип("ПолеФормы"), ЭлементФормы);
			Колонка.Вид = ?(ТекРеквизит.ТипЗначения.Типы().Количество() = 1 И ТекРеквизит.ТипЗначения.Типы()[0] = Тип(
				"Булево"), ВидПоляФормы.ПолеФлажка, ВидПоляФормы.ПолеВвода);
			Колонка.ПутьКДанным = ИмяРеквизитаФормы + "." + ТекРеквизит.Имя;
			Колонка.Подсказка = ТекРеквизит.Представление;
			ЕстьОтображаемыеРеквизиты = Истина;
		Исключение
			Сообщить("Не удалось создать колонку списка для реквизита " + ТекРеквизит.Имя);
		КонецПопытки;
	КонецЦикла;
	ЭлементФормы.РежимВыбора=РежимВыбора;
	
	//Нужно добавить кнопки на командную панель
	ГруппаКоманднаяПанель=Элементы[ИмяРеквизитаФормы + "КоманднаяПанель"];
	//Сначала кнопку открыть
	ОписаниеКнопки=УИ_РаботаСФормами.НовыйОписаниеКомандыКнопки();
	ОписаниеКнопки.Имя=ИмяРеквизитаФормы + "РедактироватьОбъект";
	ОписаниеКнопки.РодительЭлемента=ГруппаКоманднаяПанель;
	ОписаниеКнопки.СоздаватьКнопку=Истина;
	ОписаниеКнопки.ИмяКоманды="РедактироватьОбъект";
	УИ_РаботаСФормами.СоздатьКнопкуПоОписанию(ЭтотОбъект, ОписаниеКнопки);

	//Сначала кнопку открыть
	ОписаниеКнопки=УИ_РаботаСФормами.НовыйОписаниеКомандыКнопки();
	ОписаниеКнопки.Имя=ИмяРеквизитаФормы + "УдалитьВыделенныеОбъекты";
	ОписаниеКнопки.РодительЭлемента=ГруппаКоманднаяПанель;
	ОписаниеКнопки.СоздаватьКнопку=Истина;
	ОписаниеКнопки.ИмяКоманды="УдалитьВыделенныеОбъекты";
	УИ_РаботаСФормами.СоздатьКнопкуПоОписанию(ЭтотОбъект, ОписаниеКнопки);

	Если ЕстьОтображаемыеРеквизиты Тогда
		Элементы.ГруппаСтраницыВыбораДинамическогоСписка.ТекущаяСтраница = Элементы.ГруппаДинамическийСписок;
	Иначе
		Элементы.ГруппаСтраницыВыбораДинамическогоСписка.ТекущаяСтраница = Элементы.ГруппаНедоступнаяТаблица;
	КонецЕсли;
КонецПроцедуры
&НаСервере
Функция МассивТаблицРеквизитовДляОбъектаМетаданных(ОбъектМетаданных)
	МассивТаблицРеквизитов = Новый Массив;
	МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.СтандартныеРеквизиты);

	Если УИ_ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Или УИ_ОбщегоНазначения.ЭтоРегистрНакопления(
		ОбъектМетаданных) Или УИ_ОбщегоНазначения.ЭтоРегистрРасчета(ОбъектМетаданных)
		Или УИ_ОбщегоНазначения.ЭтоРегистрБухгалтерии(ОбъектМетаданных) Тогда
		МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.Измерения);
		МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.Ресурсы);
	КонецЕсли;
	
	Если УИ_ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) Тогда
		МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.Графы);
	Иначе	
		МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.Реквизиты);
	КонецЕсли;
	Если УИ_ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных) Тогда
		МассивТаблицРеквизитов.Добавить(ОбъектМетаданных.ПризнакиУчета);
	КонецЕсли;

	Возврат МассивТаблицРеквизитов;
КонецФункции

// Добавляет в дерево значений ветку описаний УстановитьПараметрыДинамическогоСпискаНаСервереобъектов.
&НаСервере
Процедура ДобавитьВДеревоВидОбъекта(Картинка, ИмяТипаМетаданных, ИмяТипаОбъектов, Представление)

	ЭлементыДерева = ДеревоМетаданных.ПолучитьЭлементы();

	строкаТипа = ЭлементыДерева.Добавить();
	строкаТипа.Картинка = Картинка;
	строкаТипа.Представление = Представление;
	строкаТипа.ТипОбъектов = ИмяТипаОбъектов;

	ЭлементыСтрокиДерева = строкаТипа.ПолучитьЭлементы();

	МассивНевыводимыхРеквизитов = Новый Массив;
	МассивНевыводимыхРеквизитов.Добавить("ССЫЛКА");
	МассивНевыводимыхРеквизитов.Добавить("ИМЯПРЕДОПРЕДЕЛЕННЫХДАННЫХ");
	МассивНевыводимыхРеквизитов.Добавить("ЭТОГРУППА");
	МассивНевыводимыхРеквизитов.Добавить("ПРОВЕДЕН");
	МассивНевыводимыхРеквизитов.Добавить("ПОМЕТКАУДАЛЕНИЯ");
	МассивНевыводимыхРеквизитов.Добавить("ЭТОТУЗЕЛ");
	МассивНевыводимыхРеквизитов.Добавить("ПРЕДОПРЕДЕЛЕННЫЙ");
	МассивНевыводимыхРеквизитов.Добавить("РОДИТЕЛЬ");

	Для Каждого мдОбъекта Из Метаданные[ИмяТипаМетаданных] Цикл
		СинонимОбъектаМетаданных = ?(ПустаяСтрока(мдОбъекта.Синоним), "", " (" + мдОбъекта.Синоним + ")");
		
		Если ЗначениеЗаполнено(СтрокаПоиска) 
			И СтрНайти(ВРег(СинонимОбъектаМетаданных), ВРег(СтрокаПоиска)) = 0 Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ЭтоЖурналДокументов=УИ_ОбщегоНазначения.ЭтоЖурналДокументов(мдОбъекта);

		строкаВида = ЭлементыСтрокиДерева.Добавить();
		строкаВида.Картинка = Картинка;
		строкаВида.Представление = мдОбъекта.Имя + СинонимОбъектаМетаданных;
		строкаВида.ТипОбъектов = ИмяТипаОбъектов;
		строкаВида.ВидОбъекта = мдОбъекта.Имя;
		строкаВида.Комментарий = мдОбъекта.Комментарий;
		строкаВида.ПолноеИмя=мдОбъекта.ПолноеИмя();

		Если НРег(строкаВида.ПолноеИмя) = НРег(ИмяОбъектаМетаданных) И ЗначениеЗаполнено(ИмяОбъектаМетаданных) Тогда
			ИдентификаторСтрокиОбъектаМетаданных=строкаВида.ПолучитьИдентификатор();
		КонецЕсли;

		МассивТаблицРеквизитов = МассивТаблицРеквизитовДляОбъектаМетаданных(мдОбъекта);

		Для Каждого ТаблицаРеквизитов Из МассивТаблицРеквизитов Цикл
			Для Каждого Реквизит Из ТаблицаРеквизитов Цикл
				Если МассивНевыводимыхРеквизитов.Найти(ВРег(Реквизит.Имя)) <> Неопределено Тогда
					Продолжить;
				КонецЕсли;

				НовыйРеквизит = строкаВида.Реквизиты.Добавить();
				НовыйРеквизит.Имя = Реквизит.Имя;
				НовыйРеквизит.Представление = Реквизит.Синоним;
				Если не ЭтоЖурналДокументов Тогда
					НовыйРеквизит.ТипЗначения = Реквизит.Тип;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьВыделенныеОбъекты(Команда)
	Если Элементы.ГруппаСтраницыВыбораДинамическогоСписка.ТекущаяСтраница <> Элементы.ГруппаДинамическийСписок Тогда
		Возврат;
	КонецЕсли;

	ИмяРеквизитаФормы = "ДинамическийСписок";

	МассивСсылок = Новый Массив;

	Для Каждого Элем Из Элементы[ИмяРеквизитаФормы].ВыделенныеСтроки Цикл
		МассивСсылок.Добавить(Элем);
	КонецЦикла;

	ЧислоЭлементов = МассивСсылок.Количество();

	Если ЧислоЭлементов = 0 Тогда
		Возврат;
	КонецЕсли;
	ТекстВопроса = "Объекты (" + ЧислоЭлементов + " шт) будут удалены из базы!
												  |Никакие проверки производиться не будут (возможно появление битых ссылок)!
												  |
												  |Продолжить?";

	ДополнительныеПараметры=Новый Структура;
	ДополнительныеПараметры.Вставить("МассивСсылок", МассивСсылок);
	ДополнительныеПараметры.Вставить("ИмяРеквизитаФормы", ИмяРеквизитаФормы);

	ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьВыделенныеОбъектыЗавершение", ЭтаФорма, ДополнительныеПараметры), ТекстВопроса,
		РежимДиалогаВопрос.ДаНет, 20, , "ВНИМАНИЕ");
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВыделенныеОбъектыЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	УдалитьВыделенныеОбъектыНаСервере(ДополнительныеПараметры.МассивСсылок);
	Элементы[ДополнительныеПараметры.ИмяРеквизитаФормы].Обновить();

КонецПроцедуры

&НаСервереБезКонтекста
Процедура УдалитьВыделенныеОбъектыНаСервере(МассивСсылок)
	Для Каждого Ссылка Из МассивСсылок Цикл
		Попытка
			пОбъект = Ссылка.ПолучитьОбъект();
			Если пОбъект = Неопределено Тогда
				Возврат;
			КонецЕсли;
			пОбъект.Удалить();
		Исключение
			Сообщить("Ошибка при удалении объекта:" + Символы.ПС + ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоМетаданных()
	ДеревоМетаданных.ПолучитьЭлементы().Очистить();
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.Справочник, "Справочники", "Справочник", "Справочники");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.Документ, "Документы", "Документ", "Документы");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.ЖурналДокументов, "ЖурналыДокументов", "ЖурналДокументов", "Журналы документов");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.ПланВидовХарактеристик, "ПланыВидовХарактеристик",
		"ПланВидовХарактеристик", "Планы видов характеристик");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.ПланСчетов, "ПланыСчетов", "ПланСчетов", "Планы счетов");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.ПланВидовРасчета, "ПланыВидовРасчета", "ПланВидовРасчета",
		"Планы видов расчёта");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.ПланОбмена, "ПланыОбмена", "ПланОбмена", "Планы обмена");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.РегистрСведений, "РегистрыСведений", "РегистрСведений",
		"Регистры сведений");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.РегистрНакопления, "РегистрыНакопления", "РегистрНакопления",
		"Регистры накопления");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.РегистрРасчета, "РегистрыРасчета", "РегистрРасчета",
		"Регистры расчета");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.РегистрБухгалтерии, "РегистрыБухгалтерии", "РегистрБухгалтерии",
		"Регистры бухгалтерии");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.БизнесПроцесс, "БизнесПроцессы", "БизнесПроцесс", "Бизнес процессы");
	ДобавитьВДеревоВидОбъекта(БиблиотекаКартинок.Задача, "Задачи", "Задача", "Задачи");		
КонецПроцедуры

&НаКлиенте
Процедура УдалитьСтрокиДереваЕслиНетПодчиненныхПриПоиске()
	ЭлементыДерева = ДеревоМетаданных.ПолучитьЭлементы();
	Счетчик = ЭлементыДерева.Количество() - 1;
	Пока Счетчик >= 0 Цикл
		СтрокаДерева = ЭлементыДерева[Счетчик];
		Если СтрокаДерева.ПолучитьЭлементы().Количество() = 0 Тогда
			ЭлементыДерева.Удалить(СтрокаДерева);
		КонецЕсли;
		Счетчик = Счетчик - 1;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти